package com.mjf.scala.chapter06

/**
 * 抽象
 */
object Scala12_TestAbstract {
  def main(args: Array[String]): Unit = {

  }
}

abstract class Person12 {
  var name: String = "lucy" // 非抽象属性
  var age: Int  // 抽象属性

  def eat() = {   // 非抽象方法
    println("Person's eat")
  }

  def sleep(): Unit // 抽象方法
}

// 在Scala语言中，重写除了方法之外，还有属性的重写
// 在子类中，如果重写的是抽象属性和方法，那么override关键字可以省略
class Student12 extends Person12 {
  override var age: Int = 18

  override def sleep(): Unit = {
    println("Student's sleep")
  }

  // 对父类的非抽象方法进行重写，override关键字不能省略
  override def eat(): Unit = {
    super.eat()   // 可以通过super关键字，去调用父类的方法
//    println(super.name) // 不能通过super关键字，访问父类的属性
    println("Student's eat")
  }

  // 在子类中，对父类的非抽象属性进行重写
  // 如果子类需要对父类的非抽象属性进行重写，属性只能是val修饰
//  override var name:String = "jack" // 编译不通过
  name = "jack" // 非抽象属性直接调用继承过来的就可以
}